Ciencia de Datos para Economistas

Clase 10- Trabajando con Data Frames-filas

Autor/a
Afiliación

MSc. José M. Avendaño

Universidad Central de Venezuela- Escuela de Economía -2024

Fecha de publicación

18 de noviembre de 2024

Objetivo

Realizar manipulaciones a los datos contenidos en una DF según diversos criterios, en particular en operaciones que afectan a las filas u observaciones.

Cargar Datos en formato XLS

library(readxl)
library(tidyverse)
## tidyverse carga los paquetes stringr y dplyr con los que se trabará en esta clas

ruta <- 'data_in/gapminder.xlsx' #'ruta_archivo'
df_gapminder <- read_xlsx(ruta)

Valores únicos presentes en un Vector

Si queremos determinar el nombre de los continentes

continentes <- unique(df_gapminder$continent)
continentes
[1] "Asia"     "Europe"   "Africa"   "Americas" "Oceania" 

Operaciones en Filas

glimpse(df_gapminder)
Rows: 1,704
Columns: 6
$ country   <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanist…
$ continent <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia"…
$ year      <dbl> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, 2002, 2007…
$ lifeExp   <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 40.822, 41.674…
$ pop       <dbl> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372, 12881816, 13…
$ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.1134, 978.0114, …

Filter por una Variable

Filtrar datos de acuerdo a un criterio

df_gapminder%>%
  filter(country=='Venezuela')
# A tibble: 12 × 6
   country   continent  year lifeExp      pop gdpPercap
   <chr>     <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Venezuela Americas   1952    55.1  5439568     7690.
 2 Venezuela Americas   1957    57.9  6702668     9802.
 3 Venezuela Americas   1962    60.8  8143375     8423.
 4 Venezuela Americas   1967    63.5  9709552     9541.
 5 Venezuela Americas   1972    65.7 11515649    10505.
 6 Venezuela Americas   1977    67.5 13503563    13144.
 7 Venezuela Americas   1982    68.6 15620766    11152.
 8 Venezuela Americas   1987    70.2 17910182     9884.
 9 Venezuela Americas   1992    71.2 20265563    10734.
10 Venezuela Americas   1997    72.1 22374398    10165.
11 Venezuela Americas   2002    72.8 24287670     8605.
12 Venezuela Americas   2007    73.7 26084662    11416.

Filter por dos criterios

Filtrar datos cuando se cumplen dos criterios sobre dos atributos

df_gapminder%>%
  filter(country=='Venezuela' & year >1992)
# A tibble: 3 × 6
  country   continent  year lifeExp      pop gdpPercap
  <chr>     <chr>     <dbl>   <dbl>    <dbl>     <dbl>
1 Venezuela Americas   1997    72.1 22374398    10165.
2 Venezuela Americas   2002    72.8 24287670     8605.
3 Venezuela Americas   2007    73.7 26084662    11416.

Filter por dos criterios sobre un mismo atributo

df_gapminder%>%
  filter(country=='Venezuela' | country =='Colombia')
# A tibble: 24 × 6
   country  continent  year lifeExp      pop gdpPercap
   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Colombia Americas   1952    50.6 12350771     2144.
 2 Colombia Americas   1957    55.1 14485993     2324.
 3 Colombia Americas   1962    57.9 17009885     2492.
 4 Colombia Americas   1967    60.0 19764027     2679.
 5 Colombia Americas   1972    61.6 22542890     3265.
 6 Colombia Americas   1977    63.8 25094412     3816.
 7 Colombia Americas   1982    66.7 27764644     4398.
 8 Colombia Americas   1987    67.8 30964245     4903.
 9 Colombia Americas   1992    68.4 34202721     5445.
10 Colombia Americas   1997    70.3 37657830     6117.
# ℹ 14 more rows

Filter por dos criterios sobre dos atributos

df_gapminder%>%
  filter(country=='Venezuela' | country =='Colombia')%>%
  filter(year>=1992)
# A tibble: 8 × 6
  country   continent  year lifeExp      pop gdpPercap
  <chr>     <chr>     <dbl>   <dbl>    <dbl>     <dbl>
1 Colombia  Americas   1992    68.4 34202721     5445.
2 Colombia  Americas   1997    70.3 37657830     6117.
3 Colombia  Americas   2002    71.7 41008227     5755.
4 Colombia  Americas   2007    72.9 44227550     7007.
5 Venezuela Americas   1992    71.2 20265563    10734.
6 Venezuela Americas   1997    72.1 22374398    10165.
7 Venezuela Americas   2002    72.8 24287670     8605.
8 Venezuela Americas   2007    73.7 26084662    11416.

Filter por dos criterios sobre dos atributos,

Dos atributos a filtrar por cada criterio. En country se filtran un país o el otro país. En year se tienen que cumplir los dos criterios &

df_gapminder%>%
  filter(country=='Venezuela' | country =='Colombia')%>%
  filter(year>=1977 & year<= 2002)
# A tibble: 12 × 6
   country   continent  year lifeExp      pop gdpPercap
   <chr>     <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Colombia  Americas   1977    63.8 25094412     3816.
 2 Colombia  Americas   1982    66.7 27764644     4398.
 3 Colombia  Americas   1987    67.8 30964245     4903.
 4 Colombia  Americas   1992    68.4 34202721     5445.
 5 Colombia  Americas   1997    70.3 37657830     6117.
 6 Colombia  Americas   2002    71.7 41008227     5755.
 7 Venezuela Americas   1977    67.5 13503563    13144.
 8 Venezuela Americas   1982    68.6 15620766    11152.
 9 Venezuela Americas   1987    70.2 17910182     9884.
10 Venezuela Americas   1992    71.2 20265563    10734.
11 Venezuela Americas   1997    72.1 22374398    10165.
12 Venezuela Americas   2002    72.8 24287670     8605.

Filter por dos criterios con operadores & y | (AND y OR)

Se introduce la función between

df_gapminder%>%
  filter(country=='Venezuela' | country =='Colombia')%>%
  filter(between(x= year, left= 1977,right= 2002))
# A tibble: 12 × 6
   country   continent  year lifeExp      pop gdpPercap
   <chr>     <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Colombia  Americas   1977    63.8 25094412     3816.
 2 Colombia  Americas   1982    66.7 27764644     4398.
 3 Colombia  Americas   1987    67.8 30964245     4903.
 4 Colombia  Americas   1992    68.4 34202721     5445.
 5 Colombia  Americas   1997    70.3 37657830     6117.
 6 Colombia  Americas   2002    71.7 41008227     5755.
 7 Venezuela Americas   1977    67.5 13503563    13144.
 8 Venezuela Americas   1982    68.6 15620766    11152.
 9 Venezuela Americas   1987    70.2 17910182     9884.
10 Venezuela Americas   1992    71.2 20265563    10734.
11 Venezuela Americas   1997    72.1 22374398    10165.
12 Venezuela Americas   2002    72.8 24287670     8605.

Filter con la función %in%

Se filtran elementos que se encuentran en un vector que en este caso es c('Colombia','Venezuela')

df_gapminder%>%
  filter(country %in% c('Colombia','Venezuela'))
# A tibble: 24 × 6
   country  continent  year lifeExp      pop gdpPercap
   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Colombia Americas   1952    50.6 12350771     2144.
 2 Colombia Americas   1957    55.1 14485993     2324.
 3 Colombia Americas   1962    57.9 17009885     2492.
 4 Colombia Americas   1967    60.0 19764027     2679.
 5 Colombia Americas   1972    61.6 22542890     3265.
 6 Colombia Americas   1977    63.8 25094412     3816.
 7 Colombia Americas   1982    66.7 27764644     4398.
 8 Colombia Americas   1987    67.8 30964245     4903.
 9 Colombia Americas   1992    68.4 34202721     5445.
10 Colombia Americas   1997    70.3 37657830     6117.
# ℹ 14 more rows

Filter usando str_detect

Cuando no existe certeza para aplicaer el criterio de igualdad, se puede usar la función str_detect del paquete stringr la cual evalúa coincidencias parciales sobre la presencia de un patrón sobre una determinada string (cadena de texto)

df_gapminder%>%
  filter(str_detect(string= country,
                    pattern='nistan'))
# A tibble: 12 × 6
   country     continent  year lifeExp      pop gdpPercap
   <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Afghanistan Asia       1952    28.8  8425333      779.
 2 Afghanistan Asia       1957    30.3  9240934      821.
 3 Afghanistan Asia       1962    32.0 10267083      853.
 4 Afghanistan Asia       1967    34.0 11537966      836.
 5 Afghanistan Asia       1972    36.1 13079460      740.
 6 Afghanistan Asia       1977    38.4 14880372      786.
 7 Afghanistan Asia       1982    39.9 12881816      978.
 8 Afghanistan Asia       1987    40.8 13867957      852.
 9 Afghanistan Asia       1992    41.7 16317921      649.
10 Afghanistan Asia       1997    41.8 22227415      635.
11 Afghanistan Asia       2002    42.1 25268405      727.
12 Afghanistan Asia       2007    43.8 31889923      975.

Funciones slice y sus variantes

Rebana, equivalente a seleccionar filas de la DF basadas en algún criterio.

slice_min()

Valore mínimo según un criterio

df_gapminder%>%
  filter(country %in% c('Colombia','Venezuela'))%>%
  slice_min(gdpPercap)
# A tibble: 1 × 6
  country  continent  year lifeExp      pop gdpPercap
  <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
1 Colombia Americas   1952    50.6 12350771     2144.

slice_min() con parámetro n

n Valores mínimos según un criterio. En este caso n=5

df_gapminder%>%
  filter(country %in% c('Colombia','Venezuela'))%>%
  slice_min(gdpPercap, n=5)
# A tibble: 5 × 6
  country  continent  year lifeExp      pop gdpPercap
  <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
1 Colombia Americas   1952    50.6 12350771     2144.
2 Colombia Americas   1957    55.1 14485993     2324.
3 Colombia Americas   1962    57.9 17009885     2492.
4 Colombia Americas   1967    60.0 19764027     2679.
5 Colombia Americas   1972    61.6 22542890     3265.

equivalente de slice_min() en Rbase

df_gapminder%>%
  filter(country %in% c('Colombia','Venezuela'))%>%
  filter(gdpPercap ==min(gdpPercap))
# A tibble: 1 × 6
  country  continent  year lifeExp      pop gdpPercap
  <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
1 Colombia Americas   1952    50.6 12350771     2144.

slice_max()

df_gapminder%>%
  filter(country %in% c('Colombia','Venezuela'))%>%
  slice_max(order_by= gdpPercap)
# A tibble: 1 × 6
  country   continent  year lifeExp      pop gdpPercap
  <chr>     <chr>     <dbl>   <dbl>    <dbl>     <dbl>
1 Venezuela Americas   1977    67.5 13503563    13144.

aplica usar el argumento n , igual que en slice_min()

equivalente de slice_max() en Rbase

df_gapminder%>%
  filter(country %in% c('Colombia','Venezuela'))%>%
  filter(gdpPercap ==max(gdpPercap))
# A tibble: 1 × 6
  country   continent  year lifeExp      pop gdpPercap
  <chr>     <chr>     <dbl>   <dbl>    <dbl>     <dbl>
1 Venezuela Americas   1977    67.5 13503563    13144.

slice_head()

df_gapminder%>%
  filter(continent==continentes[2])%>%
  slice_head(n=10)
# A tibble: 10 × 6
   country continent  year lifeExp     pop gdpPercap
   <chr>   <chr>     <dbl>   <dbl>   <dbl>     <dbl>
 1 Albania Europe     1952    55.2 1282697     1601.
 2 Albania Europe     1957    59.3 1476505     1942.
 3 Albania Europe     1962    64.8 1728137     2313.
 4 Albania Europe     1967    66.2 1984060     2760.
 5 Albania Europe     1972    67.7 2263554     3313.
 6 Albania Europe     1977    68.9 2509048     3533.
 7 Albania Europe     1982    70.4 2780097     3631.
 8 Albania Europe     1987    72   3075321     3739.
 9 Albania Europe     1992    71.6 3326498     2497.
10 Albania Europe     1997    73.0 3428038     3193.

equivalente de slice_head() en Rbase

df_gapminder%>%
  filter(continent==continentes[2])%>%
  .[1:10, ]
# A tibble: 10 × 6
   country continent  year lifeExp     pop gdpPercap
   <chr>   <chr>     <dbl>   <dbl>   <dbl>     <dbl>
 1 Albania Europe     1952    55.2 1282697     1601.
 2 Albania Europe     1957    59.3 1476505     1942.
 3 Albania Europe     1962    64.8 1728137     2313.
 4 Albania Europe     1967    66.2 1984060     2760.
 5 Albania Europe     1972    67.7 2263554     3313.
 6 Albania Europe     1977    68.9 2509048     3533.
 7 Albania Europe     1982    70.4 2780097     3631.
 8 Albania Europe     1987    72   3075321     3739.
 9 Albania Europe     1992    71.6 3326498     2497.
10 Albania Europe     1997    73.0 3428038     3193.

slice_tail()

continentes[3]
[1] "Africa"
df_gapminder%>%
  filter(continent==continentes[3])%>%
  slice_tail(n=10)
# A tibble: 10 × 6
   country  continent  year lifeExp      pop gdpPercap
   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Zimbabwe Africa     1962    52.4  4277736      527.
 2 Zimbabwe Africa     1967    54.0  4995432      570.
 3 Zimbabwe Africa     1972    55.6  5861135      799.
 4 Zimbabwe Africa     1977    57.7  6642107      686.
 5 Zimbabwe Africa     1982    60.4  7636524      789.
 6 Zimbabwe Africa     1987    62.4  9216418      706.
 7 Zimbabwe Africa     1992    60.4 10704340      693.
 8 Zimbabwe Africa     1997    46.8 11404948      792.
 9 Zimbabwe Africa     2002    40.0 11926563      672.
10 Zimbabwe Africa     2007    43.5 12311143      470.

equivalente de slice_tail() en Rbase

df_gapminder%>%
  filter(continent==continentes[3])%>%
  .[(nrow(.)-10):nrow(.), ]
# A tibble: 11 × 6
   country  continent  year lifeExp      pop gdpPercap
   <chr>    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Zimbabwe Africa     1957    50.5  3646340      519.
 2 Zimbabwe Africa     1962    52.4  4277736      527.
 3 Zimbabwe Africa     1967    54.0  4995432      570.
 4 Zimbabwe Africa     1972    55.6  5861135      799.
 5 Zimbabwe Africa     1977    57.7  6642107      686.
 6 Zimbabwe Africa     1982    60.4  7636524      789.
 7 Zimbabwe Africa     1987    62.4  9216418      706.
 8 Zimbabwe Africa     1992    60.4 10704340      693.
 9 Zimbabwe Africa     1997    46.8 11404948      792.
10 Zimbabwe Africa     2002    40.0 11926563      672.
11 Zimbabwe Africa     2007    43.5 12311143      470.

slice_sample()

Una muestra aleatoria de valores filtrando previamente de acuerdo a un criterio

continentes[1]
[1] "Asia"
df_gapminder%>%
  filter(continent==continentes[1])%>%
  slice_sample(n=10)
# A tibble: 10 × 6
   country            continent  year lifeExp       pop gdpPercap
   <chr>              <chr>     <dbl>   <dbl>     <dbl>     <dbl>
 1 Jordan             Asia       1977    61.1   1937652     2852.
 2 Israel             Asia       1987    75.6   4203148    17122.
 3 West Bank and Gaza Asia       1957    45.7   1070439     1827.
 4 India              Asia       1982    56.6 708000000      856.
 5 Iraq               Asia       1977    60.4  11882916    14688.
 6 Vietnam            Asia       2002    73.0  80908147     1764.
 7 Jordan             Asia       2002    71.3   5307470     3845.
 8 Thailand           Asia       1997    67.5  60216677     5853.
 9 Singapore          Asia       1997    77.2   3802309    33519.
10 Sri Lanka          Asia       1972    65.0  13016733     1213.

equivalente de slice_tail() en Rbase

df_gapminder%>%
  filter(continent==continentes[1])%>%
  .[sample(1:nrow(.),10),]
# A tibble: 10 × 6
   country            continent  year lifeExp      pop gdpPercap
   <chr>              <chr>     <dbl>   <dbl>    <dbl>     <dbl>
 1 Mongolia           Asia       1997    63.6  2494803     1902.
 2 Saudi Arabia       Asia       2002    71.6 24501530    19015.
 3 West Bank and Gaza Asia       1982    64.4  1425876     4336.
 4 Lebanon            Asia       1962    62.1  1886848     5715.
 5 Korea, Dem. Rep.   Asia       1967    59.9 12617009     2144.
 6 Mongolia           Asia       1972    53.8  1320500     1422.
 7 Jordan             Asia       1997    69.8  4526235     3645.
 8 Singapore          Asia       1957    63.2  1445929     2843.
 9 Korea, Rep.        Asia       2002    77.0 47969150    19234.
10 Vietnam            Asia       2007    74.2 85262356     2442.

Reordenar datos basado en un criterio arrange

df_gapminder%>%
  filter(continent==continentes[4])%>%
  arrange(gdpPercap)
# A tibble: 300 × 6
   country            continent  year lifeExp     pop gdpPercap
   <chr>              <chr>     <dbl>   <dbl>   <dbl>     <dbl>
 1 Haiti              Americas   2007    60.9 8502814     1202.
 2 Haiti              Americas   2002    58.1 7607651     1270.
 3 Haiti              Americas   1997    56.7 6913545     1342.
 4 Dominican Republic Americas   1952    45.9 2491346     1398.
 5 Haiti              Americas   1967    46.2 4318137     1452.
 6 Haiti              Americas   1992    55.1 6326682     1456.
 7 Dominican Republic Americas   1957    49.8 2923186     1544.
 8 Dominican Republic Americas   1967    56.8 4049146     1654.
 9 Haiti              Americas   1972    48.0 4698301     1654.
10 Dominican Republic Americas   1962    53.5 3453434     1662.
# ℹ 290 more rows

ojo con la sobreescritura

Reordenar en forma descendente desc()

df_gapminder%>%
  filter(continent==continentes[4])%>%
  arrange(desc(gdpPercap))
# A tibble: 300 × 6
   country       continent  year lifeExp       pop gdpPercap
   <chr>         <chr>     <dbl>   <dbl>     <dbl>     <dbl>
 1 United States Americas   2007    78.2 301139947    42952.
 2 United States Americas   2002    77.3 287675526    39097.
 3 Canada        Americas   2007    80.7  33390141    36319.
 4 United States Americas   1997    76.8 272911760    35767.
 5 Canada        Americas   2002    79.8  31902268    33329.
 6 United States Americas   1992    76.1 256894189    32004.
 7 United States Americas   1987    75.0 242803533    29884.
 8 Canada        Americas   1997    78.6  30305843    28955.
 9 Canada        Americas   1987    76.9  26549700    26627.
10 Canada        Americas   1992    78.0  28523502    26343.
# ℹ 290 more rows

Notas finales:

  • Revisar documentación de funciones para comprender los argumentos y su uso
  • Revisar funcionamiento de las equivalencias que se presentaron usando RBase